import type { AxiosError, InternalAxiosRequestConfig } from 'axios'
import axios from 'axios'
import { showNotify } from 'vant'
import { localStorage } from '@/utils/local-storage'
import { STORAGE_RETOKEN_KEY, STORAGE_TOKEN_KEY } from '@/stores/mutation-type'
import { refreshToken } from '@/api/Base/user'
import { useUser } from '@/stores/modules/user'

// 这里是用于设定请求后端时，所用的 Token KEY
// 可以根据自己的需要修改，常见的如 Access-Token，Authorization
// 需要注意的是，请尽量保证使用中横线`-` 来作为分隔符，
// 避免被 nginx 等负载均衡器丢弃了自定义的请求头
export const REQUEST_TOKEN_KEY = 'Authorization'

// 创建 axios 实例
const request = axios.create({
  // API 请求的默认前缀
  baseURL: import.meta.env.VITE_APP_API_BASE_URL,
  timeout: 6000, // 请求超时时间
})


export type RequestError = AxiosError<{
  message?: string
  result?: any
  errorMessage?: string
}>

// 异常拦截处理器
function errorHandler(error: RequestError): Promise<any> {
  if (error.response) {
    const { data = {}, status, statusText } = error.response;

    // 403 无权限
    if (status === 403) {
      showNotify({
        type: 'danger',
        message: (data && data.message) || statusText,
      });
    }

    // 401 未登录/未授权
    if (status === 401) {
      showNotify({
        type: 'danger',
        message: '登录过期',
      });

      // 获取 refreshToken
      const refreshTokenValue = localStorage.get(STORAGE_RETOKEN_KEY);

      // 执行续签流程
      refreshToken(refreshTokenValue)
        .then((res) => {
          if (res.code === 0) {
            // 续签成功，更新 token
            useUser().setToken(res.data.token, res.data.refreshToken);

            // 重发请求
            if (error.config) {
              // 更新请求头的 token
              error.config.headers[REQUEST_TOKEN_KEY] = res.data.token;

              // 重新发送请求
              return request.request(error.config);
            }
          } else {
            // 续签失败，退出登录
            useUser().logout();
            location.replace('/login');
          }
        })
        .catch(() => {
          // 续签失败，退出登录
          useUser().logout();
          location.replace('/login');
        });
    }
  }

  return Promise.reject(error);
}

// 请求拦截器
function requestHandler(config: InternalAxiosRequestConfig): InternalAxiosRequestConfig | Promise<InternalAxiosRequestConfig> {
  const savedToken = localStorage.get(STORAGE_TOKEN_KEY)
  // 如果 token 存在
  // 让每个请求携带自定义 token, 请根据实际情况修改
  if (savedToken)
    config.headers[REQUEST_TOKEN_KEY] = savedToken

  return config
}

// Add a request interceptor
request.interceptors.request.use(requestHandler, errorHandler)

// 响应拦截器
function responseHandler(response: { data: any }) {
  if(response.data.code==-1){
    showNotify({ type: 'danger', message: response.data.message })
  }
  return response.data
}

// Add a response interceptor
request.interceptors.response.use(responseHandler, errorHandler)

export default request
